package base

import (
	"errors"
	"os"
	"strconv"
	"time"

	"github.com/go-pg/pg"
	"github.com/go-redis/redis"
)

var DB *pg.DB

var Client *redis.Client

// QueryHook 查询钩子
type QueryHook struct{}

// BeforeQuery BeforeQuery
func (QueryHook) BeforeQuery(qe *pg.QueryEvent) {}

// AfterQuery AfterQuery
func (QueryHook) AfterQuery(qe *pg.QueryEvent) {
	stmt, _ := qe.FormattedQuery()
	App.Logger().Debug(stmt)
}

// 设置数据库
func SetDatabase() error {
	App.Logger().Debug("开始初始化数据库")
	if DB != nil {
		App.Logger().Debug("数据库以初始化")
		return nil
	}

	// 数据库配置文件
	host := os.Getenv("DB_HOST")
	port := os.Getenv("DB_PORT")
	database := os.Getenv("DB_DATABASE")
	username := os.Getenv("DB_USERNAME")
	password := os.Getenv("DB_PASSWORD")
	isQueryLog, err := strconv.ParseBool(os.Getenv("DB_QUERY_LOG"))
	if err != nil {
		return errors.New("处理日志参数失败")
	}
	isDebug, err := strconv.ParseBool(os.Getenv("APP_DEBUG"))
	if err != nil {
		return errors.New("处理日志参数失败")
	}

	if host == "" || port == "" || database == "" {
		return errors.New("数据库配置不正确")
	}

	DB = pg.Connect(&pg.Options{
		Addr:     host + ":" + port,
		User:     username,
		Password: password,
		Database: database,
		PoolSize: 200,
	})

	timeout, err := strconv.ParseInt(os.Getenv("DB_TIMEOUT"), 10, 10)
	if err == nil {
		App.Logger().Debug("设置数据库超时时间：", timeout)
		DB.WithTimeout(time.Duration(timeout) * time.Second)
	}

	if isDebug == true && isQueryLog == true {
		App.Logger().Debug("设置数据库debug模式")
		DB.AddQueryHook(QueryHook{})
	}
	App.Logger().Debug("数据库初始化成功")
	return nil
}

//设置redis
func SetRedis() error {
	App.Logger().Debug("初始化redis")

	Client = redis.NewClient(&redis.Options{
		Addr:     os.Getenv("REDIS_HOST") + ":" + os.Getenv("REDIS_PORT"),
		Password: os.Getenv("REDIS_PASSWORD"),
		DB:       1,
	})

	App.Logger().Debug("初始化redis成功")
	return nil
}
